package p.ithorns.tools.excel;

import cn.idev.excel.write.handler.WriteHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import p.ithorns.tools.excel.model.ImportMultiSheetResult;
import p.ithorns.tools.excel.model.ImportSheetResult;
import p.ithorns.tools.excel.model.RowError;
import p.ithorns.tools.excel.model.TemplateVo;
import p.ithorns.tools.excel.read.BaseImportHandler;
import p.ithorns.tools.excel.read.MultiSheetImporter;
import p.ithorns.tools.excel.read.SingleSheetImporter;
import p.ithorns.tools.excel.write.SingleSheetExporter;
import p.ithorns.tools.excel.write.TemplateExporter;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * EasyExcel 导出工具类
 *
 * @author -
 * @since 2023/5/31
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class EasyExcelUtil {

    private final static Logger log = LoggerFactory.getLogger(EasyExcelUtil.class);

    private EasyExcelUtil() {
    }

    /**
     * 【模板导出】（多个sheet页）
     *
     * @param response      HttpServletResponse(必填)
     * @param templatePath  模板路劲(必填)
     * @param fileName      文件名(必填)
     * @param excelBeanList excel模板构建参数集合(必填)
     * @param writeHandlers 写excel处理类
     */
    public static void exportWithTemplates(HttpServletResponse response, String templatePath, String fileName,
                                           List<TemplateVo<?>> excelBeanList, List<WriteHandler> writeHandlers) {
        TemplateExporter.exportWithTemplates(response, templatePath, fileName, excelBeanList, writeHandlers);
    }

    /**
     * 【模板导出】（多个sheet页）
     *
     * @param response      HttpServletResponse(必填)
     * @param templatePath  模板路劲(必填)
     * @param fileName      文件名(必填)
     * @param excelBeanList excel模板构建参数集合(必填)
     */
    public static void exportWithTemplates(HttpServletResponse response, String templatePath, String fileName,
                                           List<TemplateVo<?>> excelBeanList) {
        TemplateExporter.exportWithTemplates(response, templatePath, fileName, excelBeanList);
    }


    /**
     * 【模板导出】（多个sheet页）
     *
     * @param file          文件(必填)
     * @param templatePath  模板路劲(必填)
     * @param excelBeanList excel模板构建参数集合(必填)
     * @param writeHandlers 写excel处理类
     */
    public static void exportWithTemplates(File file, String templatePath, List<TemplateVo<?>> excelBeanList,
                                           List<WriteHandler> writeHandlers) {
        TemplateExporter.exportWithTemplates(file, templatePath, excelBeanList, writeHandlers);
    }

    /**
     * 【模板导出】（多个sheet页）
     *
     * @param file          文件(必填)
     * @param templatePath  模板路劲(必填)
     * @param excelBeanList excel模板构建参数集合(必填)
     */
    public static void exportWithTemplates(File file, String templatePath, List<TemplateVo<?>> excelBeanList) {
        TemplateExporter.exportWithTemplates(file, templatePath, excelBeanList);
    }


    /**
     * 导入模板
     *
     * @param fileName -文件名
     * @param clazz    -导入类型
     * @throws IOException -
     */
    public static <T> void template(HttpServletResponse response, String fileName, Class<T> clazz)
            throws IOException {
        SingleSheetExporter.template(response, fileName, clazz);
    }


    /**
     * 导入
     * <p>
     * 单(页)处理器
     *
     * @param file    -文件
     * @param handler -导入处理器
     * @return 导入结果
     */
    public static <T> ImportSheetResult<T> doImport(MultipartFile file, BaseImportHandler<T> handler) {
        return SingleSheetImporter.doImport(file, handler);
    }

    /**
     * 导入
     * <p>
     * 多(页)处理器
     *
     * @param file     -导入文件
     * @param handlers -导入处理器
     * @return 导入结果
     */
    public static ImportMultiSheetResult doImport(MultipartFile file, List<BaseImportHandler<?>> handlers) {
        return MultiSheetImporter.doImport(file, handlers);
    }

    /**
     * 指定类型导出到响应流
     *
     * @param fileName  -文件名
     * @param sheetName -表名
     * @param clazz     -导入类型
     * @throws IOException -
     */
    public static <T> void doExport(HttpServletResponse response, Class<T> clazz,
                                    String fileName, String sheetName, List<T> dataList) throws IOException {
        SingleSheetExporter.doExport(response, fileName, sheetName, clazz, dataList);
    }


    /**
     * 指定类型导出到文件
     *
     * @param dest      -目标文件
     * @param clazz     -类型(头)
     * @param sheetName -表(页)名
     * @param dataList  -数据集
     * @param <T>       -具体类型
     */
    public static <T> void doExport(File dest, String sheetName, Class<T> clazz, List<T> dataList) {
        SingleSheetExporter.doExport(dest, sheetName, clazz, dataList);
    }

    /**
     * 指定头导入到文件
     *
     * @param dest      -目标文件
     * @param head      -头信息
     * @param sheetName -表(页)名
     * @param dataList  -数据集
     * @param <T>       -具体类型
     */
    public static <T> void doExport(File dest, String sheetName, List<List<String>> head, List<T> dataList) {
        SingleSheetExporter.doExport(dest, sheetName, head, dataList);
    }

    /**
     * 导出错误数据到文件
     *
     * @param file      -错误文件
     * @param sheetName -表(页)名
     * @param clazz     -类型
     * @param dataList  -数据
     * @param <T>       -具体类型
     */
    public static <T> void doExportErrorFile(File file, String sheetName,
                                             Class<T> clazz, List<RowError<T>> dataList) {
        SingleSheetExporter.doExportErrorFile(file, sheetName, clazz, dataList);
    }

}